A well known technique used by conventional compilation systems is interprocedural analysis (IPA). IPA is a phase that is added to a compilation system to analyze an entire program and collect global information related to the translation units. Global information includes global variables and how the multiple translation units manipulate and reference the global variables. Once the global information is collected, it is then passed to the optimizer as part of the back end of the compilation system. Thus, when the optimizer optimizes a translation unit, the optimizer accesses this global information and performs additional and more aggressive optimization pertaining to global variables. IPA improves the efficiency of the generated object code by providing optimization at a global level, thereby improving the run-time performance of the executable program.
Existing IPA analysis defers analysis and optimization of a program until link time, at which time all translation units are effectively merged into one big aggregate translation unit, which is then analyzed and optimized. This means that if the programmer edits a single translation unit, the entire program must be recompiled.
Complex programs also interact with storage devices, by either reading out of or writing data into the device. The data is usually passed to the storage device through pointers. However, many pointers are used by the programmer, that are not used for writes or reads to or from storage devices. Knowing which pointers are used in what ways enables improved optimization, and better diagnostics about the program, such as use of storage locations that have not been initialized.